#ifndef BUFFER_UTIL_H
#define BUFFER_UTIL_H

#include <QtCore>

//解析接收到的缓冲区报文
class CBufferUtil
{
private:
    CBufferUtil() = default;
    ~CBufferUtil() = default;

public:
    //从缓冲区中解析连续2个字节的数据为quint16值(ui16Value=首字节*256+次字节,指针pData位置没有发送变化)
    static quint16 GetQuint16(char* pData);
    static quint16 DecodeQuint16(char* pData, int& iDataIndex);
    //从缓冲区中解析连续2个字节的数据为qint16值(i16Value=首字节*256+次字节,指针pData位置没有发送变化)
    static qint16 GetQint16(char* pData);
    static qint16 DecodeQint16(char* pData, int& iDataIndex);
    //从缓冲区中解析连续4个字节的数据为quint32值(ui32Value=首字节*256*256*256+次字节*256*256+三字节*256+四字节,指针pData位置没有发送变化)
    static quint32 GetQuint32(char* pData);
    static quint32 DecodeQuint32(char* pData, int& iDataIndex);
    //从缓冲区中解析连续4个字节的数据为qint32值(i32Value=首字节*256*256*256+次字节*256*256+三字节*256+四字节,指针pData位置没有发送变化)
    static qint32 GetQint32(char* pData);
    static qint32 DecodeQint32(char* pData, int& iDataIndex);
    //从缓冲区中解析连续4个字节的数据为float值(fValue=四字节+三字节+次字节+首字节,指针pData位置没有发送变化)
    static float GetFloat(char* pData);
    static float DecodeFloat(char* pData, int& iDataIndex);

    //将quint16值加入到缓冲区中(quint16值的高字节为首字节,quint16值的低字节为次字节)
    static void AddQuint16(char* pData, quint16 ui16ParamVal);
    static void EncodeQuint16(char* pData, quint16 ui16ParamVal, int& iDataIndex);
    //将qint16值加入到缓冲区中(qint16值的高字节为首字节,qint16值的低字节为次字节)
    static void AddQint16(char* pData, qint16 i16ParamVal);
    static void EncodeQint16(char* pData,  qint16 i16ParamVal, int& iDataIndex);
    //将quint32值加入到缓冲区中
    static void AddQuint32(char* pData, quint32 ui32ParamVal);
    static void EncodeQuint32(char* pData, quint32 ui32ParamVal, int& iDataIndex);
    //将qint32值加入到缓冲区中
    static void AddQint32(char* pData, qint32 i32ParamVal);
    static void EncodeQint32(char* pData, qint32 i32ParamVal, int& iDataIndex);
    //将float值加入到缓冲区中
    static void AddFloat(char* pData, float fParamVal);
    static void EncodeFloat(char* pData, float fParamVal, int& iDataIndex);

    //获取低16bit位(2个字节)
    static int GetLow16(qint32 iValue);
    //获取高16bit位(2个字节)
    static int GetHigh16(qint32 iValue);
    //获取第一个高字节0XAA(0xAABBCCDD)
    static quint8 GetByte1(quint32 iValue);
    //获取第二个高字节0XBB(0xAABBCCDD)
    static quint8 GetByte2(quint32 iValue);
    //获取第三个高字节0XCC(0xAABBCCDD)
    static quint8 GetByte3(quint32 iValue);
    //获取第四个高字节0XDD(0xAABBCCDD)
    static quint8 GetByte4(quint32 iValue);
    //获取低8bit位(1个字节)
    static quint8 GetLow8(quint16 iValue);
    //获取高8bit位(1个字节)
    static quint8 GetHigh8(quint16 iValue);
};

#endif //BUFFER_UTIL_H
